package service

import (
	"seat-service/initialization"
	"seat-service/model"
)

type CancelService struct {
}

// CancelReserve 取消预约
func (c *CancelService) CancelReserve(id uint) error {
	var res *model.Reserve
	tx := initialization.DB.Begin()
	err := tx.Model(&model.Reserve{}).Where("id=?", id).Find(&res).Error
	if err != nil {
		tx.Rollback()
		return err
	}
	//if res.ReserveStatus != 0 {
	//	tx.Rollback()
	//	return errors.New("非法修改")
	//}
	res.ReserveStatus = 3
	err = tx.Updates(&res).Error
	if err != nil {
		tx.Rollback()
		return err
	}

	// 取消预约时，座位状态是：1-已预约或者2-已使用
	var st *model.Seat
	err = tx.Model(&model.Seat{}).Where("id", res.SeatId).Find(&st).Error
	if err != nil {
		tx.Rollback()
		return err
	}
	// 检查座位状态。如果是使用中，就直接提交返回。否则接着走，就是预约中，检查预约情况，还有没有预约
	if st.SeatReserve == 2 {
		tx.Commit()
		return nil
	}
	// 查找座位预约记录
	var count int64
	err = tx.Model(&model.Reserve{}).Where("seat_id = ? AND reserve_status = ?", res.SeatId, 0).Count(&count).Error
	if err != nil {
		tx.Rollback()
		return err
	}
	// 如果没有预约记录，座位状态就改为已未预约。否则不用变还是已预约
	if count == 0 {
		err = tx.Model(&model.Seat{}).Where("id = ?", res.SeatId).Update("seat_reserve", 0).Error
		if err != nil {
			tx.Rollback()
			return err
		}

	}
	tx.Commit()

	return nil
}

// CancelUse 取消使用
func (c *CancelService) CancelUse(id uint) error {
	var res model.Reserve
	tx := initialization.DB.Begin()
	err := tx.Model(&model.Reserve{}).Where("id = ?", id).Find(&res).Error
	if err != nil {
		tx.Rollback()
		return err
	}
	//if res.ReserveStatus != 1 {
	//	tx.Rollback()
	//	return errors.New("非法修改")
	//}
	res.ReserveStatus = 3
	err = tx.Updates(&res).Error
	if err != nil {
		tx.Rollback()
		return err
	}

	// 取消使用时，座位状态是：2-已使用。所以只需要检查有没有预约变为未预约或者已预约就行。
	// 查找座位预约记录
	var count int64
	err = tx.Model(&model.Reserve{}).Where("seat_id = ? AND reserve_status = ?", res.SeatId, 0).Count(&count).Error
	if err != nil {
		tx.Rollback()
		return err
	}
	// 如果有预约记录，座位状态就改为已预约并提交返回。否则变为未预约再提交
	if count > 0 {
		err = tx.Model(&model.Seat{}).Where("id = ?", res.SeatId).Update("seat_reserve", 1).Error
		if err != nil {
			tx.Rollback()
			return err
		}
		tx.Commit()
		return nil
	}
	err = tx.Model(&model.Seat{}).Where("id = ?", res.SeatId).Update("seat_reserve", 0).Error
	if err != nil {
		tx.Rollback()
		return err
	}
	tx.Commit()

	return nil
}
